//
//  Convenience.swift
//  Documentation
//
//  Created by Toj on 6/26/23.
//

import Foundation

// MARK: - convenience: 便利构造器
// 使用convenience修饰的构造函数叫做便利构造函数

// MARK: - 便利构造函数的特点
/* 便利构造函数通常用在对系统的类进行构造函数的扩充时使用.
 * 1、便利构造函数通常都是写在extension里面
 * 2、便利函数init前面需要加载convenience
 * 3、在便利构造函数中需要明确的调用同一个类中的初始化器, e.g.: self.init()
 * 4、另外 convenience 的初始化方法是不能被子类重写
 * 5、子类使用便利构造器不能调用父类初始化方法(super.init...), 只能调用同类里面的初始化器
 * 6、子类继承父类convenience便利构造器函数, 使用的时候初始化可以使用父类便利构造器
*/



对于某些我们希望子类中一定实现的 designated 初始化方法，我们可以通过添加 required 关键字进行限制，强制子类对这个方法重写实现。这样做的最大的好处是可以保证依赖于某个 designated 初始化方法的 convenience 一直可以被使用。
下面的代码中如果希望初始化方法对于子类一定可用，就将 init(num: Int) 声明为必须。
输出结果：
对于 convenience 的初始化方法我们也可以加上 required 以确保子类对其进行实现。
